home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / games / ippon / source.lzh / FuncEnemy / round4.c < prev    next >
C/C++ Source or Header  |  2000-07-07  |  6KB  |  282 lines

  1. /* round4.c 回転4枚羽 */
  2. #include <xsp2lib.h>
  3.  
  4. #include "../main.h"
  5. #include "../player.h"
  6. #include "../shot.h"
  7. #include "../enemy.h"
  8. #include "../eshot.h"
  9. #include "../effect.h"
  10. #include "../psearch.h"
  11. #include "../sound.h"
  12.  
  13. #define PALET_MAIN    0x0500
  14.  
  15. #define HP_0    15
  16. #define SHOT_SPEED        7
  17.  
  18. /* 関数プロトタイプ宣言 */
  19. static short EnemyMoveRound4 (ENEMY *);
  20. static void EnemyFreeRound4 (ENEMY *);
  21.  
  22. enum {
  23.     APPEAR_LEFT = 0, APPEAR_RIGHT
  24. };
  25.  
  26.  
  27. /* 初期化ルーチン */
  28. void EnemyAllocRound4 (ENEMY * p)
  29. {
  30.     if (SHORT_LX < 144) {
  31.         p->m_work2 = APPEAR_LEFT;
  32.         p->vx = 1 * 65536;
  33.     } else {
  34.         p->m_work2 = APPEAR_RIGHT;
  35.         p->vx = -1 * 65536;
  36.     }
  37.     p->vy = 2 * 65536;
  38.  
  39.     p->pt = obj_round4 + 25;
  40.     p->info = PALET_MAIN | PRIORITY_BOSS;
  41.  
  42.     p->hit_sx = 20;
  43.     p->hit_sy = 16;
  44.     p->hp = HP_0;
  45.     p->damage = 0;
  46.     p->flash = 0;
  47.  
  48.     p->damage_mode = DAMAGE_PIERCE;
  49.     p->func_enemy_move = EnemyMoveRound4;
  50.     p->func_enemy_free = EnemyFreeRound4;
  51.  
  52.     /* コア関連 */
  53.     p->core_pt = sp_core;
  54.     p->core_info = PALET_CORE_RED | PRIORITY_BOSS;
  55.  
  56.     p->m_work = 0;
  57.  
  58.     p->m_work3 = 0;        /* 回転角(8+8bit 固定小数点) */
  59.     p->m_work4 = 2 << 8;    /* 回転角の速度 */
  60.  
  61. }
  62.  
  63.  
  64.  
  65. /* 移動ルーチン */
  66. /* 返り値:非0なら消去 */
  67. static short EnemyMoveRound4 (ENEMY * p)
  68. {
  69.     /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  70.     p->x = (p->lx += p->vx) >> 16;
  71.     p->y = (p->ly += p->vy) >> 16;
  72.  
  73.     switch (p->m_work) {
  74.     case 0:
  75.         if (SHORT_LY > 64)
  76.             p->m_work++;
  77.  
  78.         /* 回転処理 */
  79.         p->m_work3 += p->m_work4;
  80.         if (p->m_work3 > (8 << 8))
  81.             p->m_work3 -= (8 << 8);
  82.  
  83.         p->pt = obj_round4 + 25 + *(char *) (&p->m_work3);
  84.         break;
  85.  
  86.     case 1:
  87.         /* 移動処理 */
  88.         if (p->m_work2 == APPEAR_LEFT) {
  89.             if (p->vx > 0)
  90.                 p->vx -= 4096;
  91.             else
  92.                 p->vx = 0;
  93.         } else {
  94.             if (p->vx < 0)
  95.                 p->vx += 4096;
  96.             else
  97.                 p->vx = 0;
  98.         }
  99.         if (SHORT_VY > 0)
  100.             p->vy -= 4096;
  101.  
  102.         /* 回転処理 */
  103.         p->m_work3 += p->m_work4;
  104.         if (p->m_work4 > 32)
  105.             p->m_work4 -= 8;
  106.         p->pt = obj_round4 + 25 + *(char *) (&p->m_work3);
  107.         if (p->m_work3 > (8 << 8)) {
  108.             p->m_work3 -= (8 << 8);
  109.             p->pt = obj_round4 + 25;
  110.             if (p->m_work4 < 192) {
  111.                 /* 回転数が落ちてほとんど停止したら次の段階へ移行 */
  112.                 p->m_work++;
  113.                 p->vx = 0;
  114.                 p->pt = obj_round4;
  115.             }
  116.         }
  117.         break;
  118.  
  119.     case 2:        /* 羽を開く */
  120.         if (SHORT_VY > 0)
  121.             p->vy -= 4096;
  122.  
  123.         p->pt++;
  124.         if (p->pt == obj_round4 + 13)
  125.             SoundSetSE (SE_LOCK);    /* 「がちゃん」という効果音を鳴らす */
  126.  
  127.         /* 攻撃処理 */
  128. #define SPEED_SHOT2    8
  129.         if (p->pt == obj_round4 + 14) {
  130.             char a = psearch (p->x, p->y);
  131.             EshotAlloc (ESHOT_NRG04, p->x - 20, p->y - 20, SPEED_SHOT2, a, 0);
  132.             EshotAlloc (ESHOT_NRG04, p->x + 20, p->y - 20, SPEED_SHOT2, a, 0);
  133.             EshotAlloc (ESHOT_NRG04, p->x - 20, p->y + 20, SPEED_SHOT2, a, 0);
  134.             EshotAlloc (ESHOT_NRG04, p->x + 20, p->y + 20, SPEED_SHOT2, a, 0);
  135.             EshotAlloc (ESHOT_NRG03, p->x - 16, p->y - 16, SPEED_SHOT2, a, 0);
  136.             EshotAlloc (ESHOT_NRG03, p->x + 16, p->y - 16, SPEED_SHOT2, a, 0);
  137.             EshotAlloc (ESHOT_NRG03, p->x - 16, p->y + 16, SPEED_SHOT2, a, 0);
  138.             EshotAlloc (ESHOT_NRG03, p->x + 16, p->y + 16, SPEED_SHOT2, a, 0);
  139.             SoundSetSE (SE_ESHOT);    /* 敵ショット音 */
  140.         }
  141.         if (p->pt > obj_round4 + 23) {
  142.             p->m_work++;
  143.             p->s_work = p->s_work2 = p->s_work3 = 0;
  144.             p->m_work3 = 0;        /* 回転角(8+8bit固定小数点) */
  145.             p->m_work4 = 16;    /* 回転角加速度 */
  146.         }
  147.         break;
  148.  
  149.     case 3:        /* 開いた状態で回転 */
  150.         /* 移動処理 */
  151.         if (p->m_work2 == APPEAR_LEFT) {
  152.             if (p->vx < 65536)
  153.                 p->vx += 4096;
  154.         } else {
  155.             if (p->vx > -65536)
  156.                 p->vx -= 4096;
  157.         }
  158.         if (p->vy < 65536)
  159.             p->vy += 4096;
  160.  
  161.         /* 回転処理 */
  162.         p->m_work3 += p->m_work4;
  163.         if (p->m_work4 < 256)
  164.             p->m_work4 += 4;
  165.         else
  166.             p->m_work4 = 256;
  167.  
  168.         if (p->m_work3 > (8 << 8))
  169.             p->m_work3 -= (8 << 8);
  170.  
  171.         p->pt = obj_round4 + 25 + 9 + *(char *) (&p->m_work3);
  172.  
  173. #define SPEED_SHOT3    8
  174. #define INTERVAL2_1    27
  175.         /* 攻撃処理 */
  176. #if    0
  177.         switch (p->s_work++) {
  178.         case 1:
  179.             p->s_angle = psearch (p->x, p->y);
  180.             /* 右か左か */
  181.             if (SHORT_LX < player->x)
  182.                 p->s_angle2 = 8;
  183.             else
  184.                 p->s_angle2 = -8;
  185.         case 1 + INTERVAL2_1 * 1:
  186.         case 1 + INTERVAL2_1 * 2:
  187.             EshotAlloc (ESHOT_NRG14N, p->x, p->y, SPEED_SHOT3, p->s_angle += p->s_angle2, 0);
  188.             break;
  189.         case 1 + INTERVAL2_1 * 2 + 1:
  190.             p->m_work++;
  191.             break;
  192.         default:
  193.             break;
  194.         }
  195. #else
  196.         if (p->s_work++ == INTERVAL2_1 * 2 + 1)
  197.             p->m_work++;
  198. #endif
  199.         break;
  200.  
  201.     case 4:        /* 上昇して逃げる */
  202.         /* 移動処理 */
  203.         if (p->m_work2 == APPEAR_LEFT) {
  204.             if (p->vx > -65536)
  205.                 p->vx -= 4096;
  206.         } else {
  207.             if (p->vx < 65536)
  208.                 p->vx += 4096;
  209.         }
  210.         if (p->vy > -65536)
  211.             p->vy -= 4096;
  212.  
  213.         /* 回転処理 */
  214.         p->m_work3 += p->m_work4;
  215.         if (p->m_work4 < 256)
  216.             p->m_work4 += 4;
  217.         else
  218.             p->m_work4 = 256;
  219.         if (p->m_work3 > (8 << 8))
  220.             p->m_work3 -= (8 << 8);
  221.         p->pt = obj_round4 + 25 + 9 + *(char *) (&p->m_work3);
  222.  
  223.         /* 画面外に出たら消去 */
  224.         if (SHORT_LY < -48)
  225.             return (-1);    /* 消去 */
  226.         break;
  227.     }
  228.  
  229.  
  230.     /* もし前回ダメージを受けたなら */
  231.     if (p->damage) {
  232.         p->hp -= p->damage;
  233.         p->damage = 0;
  234.         SoundSetSE (SE_DAMAGE);        /* 敵ダメージ音 */
  235.  
  236.         /* 白(or赤)フラッシュ処理 */
  237.         if (p->info == (PALET_MAIN | PRIORITY_BOSS)) {
  238.             if (p->hp < HP_PALET_RED)
  239.                 p->info = PALET_RED | PRIORITY_BOSS;
  240.             else
  241.                 p->info = PALET_DAMAGE | PRIORITY_BOSS;
  242.         } else {
  243.             p->info = PALET_MAIN | PRIORITY_BOSS;
  244.         }
  245.  
  246.  
  247.         /* 耐久力が0以下なら消去 */
  248.         if (p->hp <= 0) {
  249.             EffectAlloc (EFFECT_EXPL, 0, p->x, p->y);    /* 爆発パターンを出現させる */
  250.             EffectAlloc (EFFECT_POINTS, POINTS_1500, p->x, p->y);    /* 得点を出現させる */
  251.             SoundSetSE (SE_EXPL_M);        /* 中ボス爆発音 */
  252.             return (-1);
  253.         }
  254.     } else {
  255.         /* 耐久力が少なくなったら赤フラッシュ */
  256.         if ((p->flash++ > TIMER_FLASH_RED) && (p->hp < HP_PALET_RED)) {
  257.             p->info = PALET_RED | PRIORITY_BOSS;
  258.             if (p->flash > TIMER_FLASH_NORMAL)
  259.                 p->flash = 0;
  260.         } else {
  261.             p->info = PALET_MAIN | PRIORITY_BOSS;
  262.         }
  263.     }
  264.     xobj_set_st (p);    /* 表示 */
  265.  
  266.     /* コアの表示 */
  267.     p->core_x = p->x - 8;
  268.     p->core_y = p->y - 8;
  269.     xsp_set_st (&(p->core_x));
  270.  
  271.     return (0);
  272. }
  273.  
  274.  
  275. /* 消去ルーチン */
  276. static void EnemyFreeRound4 (ENEMY * p)
  277. {
  278.     /* 刺さったショットの処理 */
  279.     if ((p->shot) && (p->shot->enemy) && (p->shot->enemy == p))
  280.         p->shot->status = SHOT_STATUS_NON;
  281. }
  282.